import axios from 'axios'
import { ElMessage } from 'element-plus'
import { getToken, removeToken } from '@/utils/auth'

// 创建axios实例
const service = axios.create({
    baseURL: 'http://localhost:8080', // 后端API基础URL
    timeout: 10000, // 请求超时时间
    headers: {
        'Content-Type': 'application/json;charset=UTF-8'
    }
})

// 请求拦截器
service.interceptors.request.use(
    config => {
        // 是否需要设置token
        const isToken = (config.headers || {}).isToken === false
        if (getToken() && !isToken) {
            config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token
        }

        // 是否需要防止数据重复提交
        const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
        if (config.method === 'post' && !isRepeatSubmit) {
            const requestObj = {
                url: config.url,
                data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
                time: new Date().getTime()
            }
            const sessionObj = window.sessionStorage.getItem('requestObj')
            if (sessionObj) {
                const sObj = JSON.parse(sessionObj)
                const interval = 1000
                if (sObj.url === requestObj.url && requestObj.time - sObj.time < interval) {
                    const message = '数据正在处理，请勿重复提交'
                    console.warn(`[${config.url}]: ` + message)
                    return Promise.reject(new Error(message))
                }
            }
            window.sessionStorage.setItem('requestObj', JSON.stringify(requestObj))
        }

        return config
    },
    error => {
        console.log(error)
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    response => {

        // 检查response是否存在
        if (!response) {
            ElMessage.error('响应对象为空');
            return Promise.reject(new Error('响应对象为空'));
        }

        const res = response.data;

        // 二进制数据则直接返回
        if (response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer') {
            return response.data
        }

        // 如果是文件下载，直接返回
        if (response.headers['content-type'] && response.headers['content-type'].includes('application/octet-stream')) {
            return response
        }

        // 确保res存在且是对象
        if (!res || typeof res !== 'object') {
            console.error('响应数据格式错误:', res);
            ElMessage.error('响应数据格式错误');
            return Promise.reject(new Error('响应数据格式错误'));
        }

        // 根据自定义错误码判断请求是否成功
        if (res.code === 200) {
            return res
        } else {
            // 处理业务错误
            const errorMsg = res && res.msg ? res.msg : '系统未知错误，请反馈给管理员';
            ElMessage.error(errorMsg);

            // 401: 未登录或token过期
            if (res.code === 401) {
                // 清除token并跳转登录页
                removeToken()
                window.location.href = '/login'
            }

            return Promise.reject(new Error(errorMsg))
        }
    },
    error => {
        console.log('响应拦截器错误:', error);
        console.log('错误详情:', error.response);

        let message = '未知错误';

        if (error.message) {
            message = error.message;
        }

        if (message == "Network Error") {
            message = "后端接口连接异常"
        } else if (message.includes("timeout")) {
            message = "系统接口请求超时"
        } else if (message.includes("Request failed with status code")) {
            message = "系统接口" + message.substr(message.length - 3) + "异常"
        }

        ElMessage.error(message)
        return Promise.reject(error)
    }
)

export default service